import com.baomidou.mybatisplus.extension.api.R;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 赵勇镔
 * @Time: 2021/5/20 9:51
 * @Description:
 */
public class CompletableFutureDemo2 {
    public static void main(String[] args) throws Exception {


        CompletableFuture<Void> h1 = CompletableFuture.supplyAsync(() -> {//无入参有返回值
            System.out.println("我是第一个任务");
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 1;
        }).thenApply((t) -> {//接收上一个任务结果,并且有返回
            System.out.println("我是第二个任务");
            return t + 1;//与上一个返回值类型可以不一致
        }).thenAccept((t) -> {//接收上一个任务结果,无返回值
            System.out.println("我是第三个任务");
            System.out.println(t);
        }).thenRun(() -> { //无参无返回
            System.out.println("我是第四个任务");
        });

        CompletableFuture<Void> h2 = CompletableFuture.supplyAsync(() -> {//无入参有返回值
            System.out.println("它是第一个任务");
            return 1;
        }).thenApply((t) -> {//接收上一个任务结果,并且有返回
            System.out.println("它是第二个任务");
            return t + 1;//与上一个返回值类型可以不一致
        }).thenAccept((t) -> {//接收上一个任务结果,无返回值
            System.out.println("它是第三个任务");
            System.out.println(t);
        }).thenRun(() -> { //无参无返回
            System.out.println("它是第四个任务");
        });

        //等待两个线程结束 main再结束
        CompletableFuture.allOf(h1,h2).join();
        CompletableFuture.anyOf(h1,h2).join();



    }

}
